package cn.yan.luowowo.interceptor;


import cn.yan.luowowo.annotation.RequireLogin;
import cn.yan.luowowo.cache.service.UserInfoRedisService;
import cn.yan.luowowo.domain.UserInfo;
import cn.yan.luowowo.util.JsonResult;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
用户登录拦截
 */
public class CheckLoginInterceptor implements HandlerInterceptor{

    @Autowired
    private UserInfoRedisService userInfoRedisService;

    //登录拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{
        //解决跨域拦截和静态请求拦截
        if(!(handler instanceof HandlerMethod)){
            return true;
        }

        /*
        handler---请求方法处理器
        1.springmvc在启动时时将所有的请求映射方法解析，并且封装成一个对象：handlerMethod

        2.springmvc定义一个类似map对象管理所有的请求映射方法对象
        map的key是请求映射方法的url，value是请求映射方法的对象
        {
        "/users/getCurrentUser"----handlerMethod
        "/users/checkPhone"-----handlerMethod
        }

        3.浏览器发起请求时，输入url地址

        服务器解析url路劲，获取/users/getCurrentUser进而获取该映射url对应映射方法对象：handlerMethod

        4.springmvc马上调用checkloginInterceptor类对象，执行preHandle方法，参数是：请求对象，响应对象，handlerMethod
         */


        // 1.识别请求映射方法是否贴有@RequireLogin
        HandlerMethod hm = (HandlerMethod) handler;
        String token = request.getHeader("token");
        //根据token查询redis
        //所有访问如果有登录，都重置登录时间30分钟
        UserInfo user = userInfoRedisService.getUserByToken(token);
        if(hm.hasMethodAnnotation(RequireLogin.class)){
            //2.贴有注解则需要登录校验

        //判断user
        if(user==null){
            //打印信息
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(JSON.toJSONString(JsonResult.noLogin()));
            return false;
        }
        }

        ///3.没贴注解则放行
        return true;
    }
}
